【精选】MFC创建弹出式的CWnd窗口

您所在的位置:网站首页 mfc hwnd 【精选】MFC创建弹出式的CWnd窗口

【精选】MFC创建弹出式的CWnd窗口

2023-11-05 21:58| 来源: 网络整理| 查看: 265

在MFC中,CWnd类常用于子窗口(WS_CHILD)的创建。相较于CDialog、CDialogEx,用CWnd创建子窗口,一个明显的好处是CWnd不依赖当前模块的对话框资源,更利于dll的封装,避免跨模块调用时的资源切换。

现有一个继承于CWnd的类:CMyWnd。接下来使用该类进行说明。

// CMyWnd class CMyWnd : public CWnd { DECLARE_DYNAMIC(CMyWnd) public: CMyWnd(); virtual ~CMyWnd(); protected: DECLARE_MESSAGE_MAP() public: }; WS_POPUP 与 CreateEx

创建一个WS_CHILD属性的子窗口,代码如下:

CMyWnd* pWnd = new CMyWnd(); pWnd->Create(NULL, _T("MyWnd"), WS_CHILD, CRect(0, 0, 200, 50), this, 1);

如果是创建一个弹出式的窗口,直接使用WS_POPUP?

CMyWnd* pWnd = new CMyWnd(); pWnd->Create(NULL, _T("MyWnd"), WS_POPUP, CRect(0, 0, 200, 50), this, 1);

编译通过,运行,出现异常,VS输出界面能看到这样的提示: wincore.cpp(734) : AppMsg - Warning: Window creation failed: GetLastError returns 0x00000579 (错误代码 0x00000579:ERROR_INVALID_MENU_HANDLE,无效的菜单句柄)

提示说明窗口创建失败。通过调试,找到异常的地方:

BOOL CWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // can't use for desktop or pop-up windows (use CreateEx instead) ASSERT(pParentWnd != NULL); ASSERT((dwStyle & WS_POPUP) == 0); if (((dwStyle & WS_TABSTOP) == WS_TABSTOP) && (nID == 0)) { // Warn about nID == 0. A zero ID will be overridden in CWnd::PreCreateWindow when the // check is done for (cs.hMenu == NULL). This will cause the dialog control ID to be // different than passed in, so ::GetDlgItem(nID) will not return the control HWND. TRACE(traceAp


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3